package loja.dao.impl.hibernate;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import loja.dao.conta.ContaPublicaDAO;
import loja.model.conta.operacao.Operacao;
import loja.model.conta.operacao.OperacaoCaixa;

import org.hibernate.Session;
import org.hibernate.criterion.Order;

public class ContaCaixaDAOHibernate implements ContaPublicaDAO {

	private Session session;

	public ContaCaixaDAOHibernate(Session session) {
		this.session = session;
	}

	@Override
	public void addOperacao(Operacao operacao) {
		OperacaoCaixa operacaoContaPublica = new OperacaoCaixa(
				operacao.getHistorico(), operacao.getValor());
		this.session.save(operacaoContaPublica);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Operacao> listarOperacoes() {
		List<OperacaoCaixa> operacoes = this.session
				.createCriteria(OperacaoCaixa.class)
				.addOrder(Order.desc("data")).list();
		List<Operacao> operacoesClone = new ArrayList<>();
		for (Operacao operacao : operacoes) {
			operacoesClone.add((Operacao) operacao.clone());
		}
		return operacoesClone;

	}

	@Override
	public BigDecimal getSaldoConta() {
		BigDecimal saldo = BigDecimal.ZERO;
		for (Operacao operacao : listarOperacoes()) {
			saldo = saldo.add(operacao.getValor());
		}
		return saldo;
	}

}
